/*******************************************************************************
* Signavio Core Components
* Copyright (C) 2012 Signavio GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package de.hpi.bpmn2_0.model.extension;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlValue;
import de.hpi.bpmn2_0.transformation.Constants;
import de.hpi.bpmn2_0.transformation.Diagram2BpmnConverter;
/**
* JAXB does not support dynamic naming of XML elements. The property list is
* implemented like a hash map. The class name represents the name of the
* element and content is the value of the xml element.
*
* @author Sven Wagner-Boysen
*
*/
@XmlSeeAlso(DummyPropertyListItem.class)
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class PropertyListItem {
private static List<Class<? extends PropertyListItem>> classes = new ArrayList<Class<? extends PropertyListItem>>();
private static List<Class<? extends PropertyListItem>> getItemClasses() {
List<Class<? extends PropertyListItem>> classesList = new ArrayList<Class<? extends PropertyListItem>>(classes);
Constants c = Diagram2BpmnConverter.getConstants();
if(c == null) {
return classesList;
}
classesList.addAll(c.getAdditionalPropertyItemClasses());
return classesList;
}
/** Default constructor */
public PropertyListItem() {}
/**
* Constructor to set the value of the element directly.
*
* @param propertyIdentifier
* Identifier for the appropriate class
* @param value
* The value of the property
*/
public static PropertyListItem addItem(String propertyName, String value) {
/* Find property class */
Class<? extends PropertyListItem> propertyItemClass = null;
for(Class<? extends PropertyListItem> propItemClass : getItemClasses()) {
if(propItemClass.getSuperclass() == null
|| !propItemClass.getSuperclass().equals(PropertyListItem.class))
continue;
PropertyId propId = propItemClass.getAnnotation(PropertyId.class);
if(propId == null)
continue;
if(propId.value() != null && propId.value().equals(propertyName)) {
propertyItemClass = (Class<? extends PropertyListItem>) propItemClass;
}
}
/* Create instance of property item */
if(propertyItemClass == null)
return null;
try {
PropertyListItem propItem = propertyItemClass.newInstance();
propItem.setContent(value);
return propItem;
} catch (Exception e) {
return null;
}
}
@XmlValue
protected String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Target({
ElementType.TYPE
})
@Retention(RetentionPolicy.RUNTIME)
public @interface PropertyId {
String value();
}
}